
#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	Если Параметры.Свойство("ОбъектПоиска") Тогда
		Объект.ИсходныйОбъект = Параметры.ОбъектПоиска;
	КонецЕсли;
	
	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);
	
КонецПроцедуры

&НаКлиенте
Процедура ПриОткрытии(Отказ)
	Если ЗначениеЗаполнено(Объект.ИсходныйОбъект) Тогда
		ИсходныйОбъектПриИзменении(Неопределено);
		ВыполнитьПоискСсылок();
	КонецЕсли;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовФормы

&НаКлиенте
Процедура ИсходныйОбъектПриИзменении(Элемент)
	ПриИзмененииИсходногоОбъекта();
КонецПроцедуры

&НаКлиенте
Процедура ИсходныйОбъектОчистка(Элемент, СтандартнаяОбработка)
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияОчистка(ЭтотОбъект,
																							 Элемент,
																							 "ИсходныйОбъект");
	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.СтруктураХраненияЗначения = Объект;

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикОчистка(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура ИсходныйОбъектНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	ДоступныеНаборыТипов = УИ_ОбщегоНазначенияКлиентСервер.ДоступныеНаборыТиповДляРедактирования();
	
	ПараметрыОбработчика = УИ_ОбщегоНазначенияКлиент.НовыйПараметрыОбработчикаСобытияНачалоВыбораЗначения(ЭтотОбъект,
																										  Элемент,
																										  "ИсходныйОбъект");
	ПараметрыОбработчика.ДоступенКонтейнер = Ложь;
	ПараметрыОбработчика.Значение = Объект.ИсходныйОбъект;
	ПараметрыОбработчика.СтруктураХраненияЗначения = Объект;
	ПараметрыОбработчика.НаборТипов = ДоступныеНаборыТипов.Ссылки;
	ПараметрыОбработчика.ОповещениеОЗавершении = Новый ОписаниеОповещения("ИсходныйОбъектНачалоВыбораЗавершениеВыбораЗначения",
		ЭтотОбъект);

	УИ_ОбщегоНазначенияКлиент.ПолеФормыОбработчикНачалоВыбораЗначения(ПараметрыОбработчика, СтандартнаяОбработка);
КонецПроцедуры

&НаКлиенте
Процедура РезультатПоискаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ОткрытьОбъектТекущейСтроки();
КонецПроцедуры

&НаКлиенте
Процедура РезультатПоискаПриАктивизацииСтроки(Элемент)
	ТекДанные = Элементы.РезультатПоиска.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		ВидимостьКомандыОткрытия = Ложь;
		ВидимостьКомандыПоиска = Ложь;
	Иначе
		ВидимостьКомандыОткрытия = ТекДанные.МожноОткрыть;
		ВидимостьКомандыПоиска = ТекДанные.СсылочныйТип;
	КонецЕсли;

	Элементы.ТаблицаКонтекстноеМенюОткрытьОбъект.Видимость = ВидимостьКомандыОткрытия;
	Элементы.ТаблицаКонтекстноеМенюПоискДляОбъекта.Видимость = ВидимостьКомандыПоиска;
КонецПроцедуры


#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура НайтиСсылки(Команда)
	ВыполнитьПоискСсылок();
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбъект(Команда)
	ОткрытьОбъектТекущейСтроки();
КонецПроцедуры

&НаКлиенте
Процедура ПоискДляОбъекта(Команда)
	ТекДанные = Элементы.РезультатПоиска.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Не ТекДанные.СсылочныйТип Тогда
		Возврат;
	КонецЕсли;

	ПараметрыФормы = Новый Структура;
	ПараметрыФормы.Вставить("ОбъектПоиска", ТекДанные.НайденныйОбъект);

	ОткрытьФорму("Обработка.УИ_ПоискСсылокНаОбъект.Форма", ПараметрыФормы, , Новый УникальныйИдентификатор);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьОбъект(Команда)
	ТекДанные = Элементы.РезультатПоиска.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(ТекДанные.НайденныйОбъект);
КонецПроцедуры

&НаКлиенте
Процедура РедактироватьИсходныйОбъект(Команда)
	Если Не ЗначениеЗаполнено(Объект.ИсходныйОбъект) Тогда
		Возврат;
	КонецЕсли;

	УИ_ОбщегоНазначенияКлиент.РедактироватьОбъект(Объект.ИсходныйОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ИсходныйОбъектПоСсылке(Команда)
	ОбработчикЗавершения = Новый ОписаниеОповещения("ВводНавигационнойСсылкиЗавершение", ЭтотОбъект);
	ПоказатьВводСтроки(ОбработчикЗавершения, , "Нав. ссылка на объект (e1cib/data/...)");
КонецПроцедуры

&НаКлиенте
Процедура ВводНавигационнойСсылкиЗавершение(РезультатВвода, ДопПараметры) Экспорт
	Если РезультатВвода = Неопределено Тогда
		Возврат;
	КонецЕсли;	
	
	НайденныйОбъект = вНайтиОбъектПоURL(РезультатВвода);
	Если Объект.ИсходныйОбъект <> НайденныйОбъект Тогда
		Объект.ИсходныйОбъект = НайденныйОбъект;
		ИсходныйОбъектПриИзменении(Неопределено);
	КонецЕсли;
	
КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции


&НаКлиенте
Процедура ПриИзмененииИсходногоОбъекта()
	Если Не ЗначениеЗаполнено(Объект.ИсходныйОбъект) Тогда
		УникальныйИдентификаторИсточника="";
	Иначе
		Попытка
			УникальныйИдентификаторИсточника = Объект.ИсходныйОбъект.УникальныйИдентификатор();
		Исключение
			//TODO Убрать это кривое решение проблемы
		КонецПопытки;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ИсходныйОбъектНачалоВыбораЗавершениеВыбораЗначения(Результат, ДополнительныеПараметры) Экспорт
	ПриИзмененииИсходногоОбъекта();
КонецПроцедуры

&НаСервере
Процедура ВыполнитьПоискСсылокНаСервере()
	Если Не ЗначениеЗаполнено(Объект.ИсходныйОбъект) Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не выбран объект, на который необходимо найти ссылки", ,
			"Объект.ИсходныйОбъект");
		Возврат;
	КонецЕсли;

	СоответствиеМожноЛиОткрывать = Новый Соответствие;
	СоответствиеМожноЛиОткрывать.Вставить(0, Ложь); // 0
	СоответствиеМожноЛиОткрывать.Вставить(1, Истина); // 1 Константа
	СоответствиеМожноЛиОткрывать.Вставить(2, Истина); // 2 Справочник
	СоответствиеМожноЛиОткрывать.Вставить(3, Истина); // 3 Документ
	СоответствиеМожноЛиОткрывать.Вставить(4, Ложь); // 4 Регистр накопления
	СоответствиеМожноЛиОткрывать.Вставить(5, Ложь); // 5 Регистр бухгалтерии
	СоответствиеМожноЛиОткрывать.Вставить(6, Ложь); // 6 Регистр расчета
	СоответствиеМожноЛиОткрывать.Вставить(7, Истина); // 7 Регистр сведений
	СоответствиеМожноЛиОткрывать.Вставить(8, Истина); // 8 Бизнес процесс
	СоответствиеМожноЛиОткрывать.Вставить(9, Истина); // 9 Задача
	СоответствиеМожноЛиОткрывать.Вставить(10, Истина); // 10 План видов характеристик
	СоответствиеМожноЛиОткрывать.Вставить(11, Истина); // 11 План видов расчета
	СоответствиеМожноЛиОткрывать.Вставить(12, Истина); // 12 План счетов
	СоответствиеМожноЛиОткрывать.Вставить(13, Истина); // 13 Внешний источник данных набор
	СоответствиеМожноЛиОткрывать.Вставить(14, Истина); // 14 Внешний источник данных ссылка
	СоответствиеСсылочныйТип = Новый Соответствие;
	СоответствиеСсылочныйТип.Вставить(0, Ложь); // 0
	СоответствиеСсылочныйТип.Вставить(1, Ложь); // 1 Константа
	СоответствиеСсылочныйТип.Вставить(2, Истина); // 2 Справочник
	СоответствиеСсылочныйТип.Вставить(3, Истина); // 3 Документ
	СоответствиеСсылочныйТип.Вставить(4, Ложь); // 4 Регистр накопления
	СоответствиеСсылочныйТип.Вставить(5, Ложь); // 5 Регистр бухгалтерии
	СоответствиеСсылочныйТип.Вставить(6, Ложь); // 6 Регистр расчета
	СоответствиеСсылочныйТип.Вставить(7, Ложь); // 7 Регистр сведений
	СоответствиеСсылочныйТип.Вставить(8, Истина); // 8 Бизнес процесс
	СоответствиеСсылочныйТип.Вставить(9, Истина); // 9 Задача
	СоответствиеСсылочныйТип.Вставить(10, Истина); // 10 План видов характеристик
	СоответствиеСсылочныйТип.Вставить(11, Истина); // 11 План видов расчета
	СоответствиеСсылочныйТип.Вставить(12, Истина); // 12 План счетов
	СоответствиеСсылочныйТип.Вставить(13, Ложь); // 13 Внешний источник данных набор
	СоответствиеСсылочныйТип.Вставить(14, Истина); // 14 Внешний источник данных ссылка
	СоответствиеКартинок = Новый Соответствие;
	СоответствиеКартинок.Вставить(0, Новый Картинка); // 0
	СоответствиеКартинок.Вставить(1, БиблиотекаКартинок.Константа); // 1 Константа
	СоответствиеКартинок.Вставить(2, БиблиотекаКартинок.Справочник); // 2 Справочник
	СоответствиеКартинок.Вставить(3, БиблиотекаКартинок.Документ); // 3 Документ
	СоответствиеКартинок.Вставить(4, БиблиотекаКартинок.РегистрНакопления); // 4 Регистр накопления
	СоответствиеКартинок.Вставить(5, БиблиотекаКартинок.РегистрБухгалтерии); // 5 Регистр бухгалтерии
	СоответствиеКартинок.Вставить(6, БиблиотекаКартинок.РегистрРасчета); // 6 Регистр расчета
	СоответствиеКартинок.Вставить(7, БиблиотекаКартинок.РегистрСведений); // 7 Регистр сведений
	СоответствиеКартинок.Вставить(8, БиблиотекаКартинок.БизнесПроцесс); // 8 Бизнес процесс
	СоответствиеКартинок.Вставить(9, БиблиотекаКартинок.Задача); // 9 Задача
	СоответствиеКартинок.Вставить(10, БиблиотекаКартинок.ПланВидовХарактеристик); // 10 План видов характеристик
	СоответствиеКартинок.Вставить(11, БиблиотекаКартинок.ПланВидовРасчета); // 11 План видов расчета
	СоответствиеКартинок.Вставить(12, БиблиотекаКартинок.ПланСчетов); // 12 План счетов
	СоответствиеКартинок.Вставить(13, БиблиотекаКартинок.ВнешнийИсточникДанныхТаблица); // 13 Внешний источник данных набор
	СоответствиеКартинок.Вставить(14, БиблиотекаКартинок.ВнешнийИсточникДанныхТаблица); // 14 Внешний источник данных ссылка
	МассивПоиска = Новый Массив;
	МассивПоиска.Добавить(Объект.ИсходныйОбъект);

	ТаблицаСсылок = НайтиПоСсылкам(МассивПоиска);

	РезультатПоиска.Очистить();
	Объект.КоличествоНайденных = ТаблицаСсылок.Количество();

	Первый = Истина;
	Для Каждого СтрокаНайденнного Из ТаблицаСсылок Цикл
	// 0 - find object
	// 1 - found object
	// 2 - metadata object
		БазовыйТипЧислом = ТипМетаданныхЧислом(СтрокаНайденнного.Метаданные);

		ПредставлениеНайденного = ПредставлениеНайденногоОбъекта(БазовыйТипЧислом, СтрокаНайденнного.Метаданные,
			СтрокаНайденнного.Данные) + " (" + СтрокаНайденнного.Метаданные.ПолноеИмя() + ")";

		НоваяСтрока = РезультатПоиска.Добавить();
		НоваяСтрока.Ссылка = СтрокаНайденнного.Ссылка;
		НоваяСтрока.ПредставлениеОбъекта = ПредставлениеНайденного;
		НоваяСтрока.НайденныйОбъект = СтрокаНайденнного.Данные;
		НоваяСтрока.Картинка = СоответствиеКартинок[БазовыйТипЧислом];
		НоваяСтрока.МожноОткрыть = СоответствиеМожноЛиОткрывать[БазовыйТипЧислом];
		НоваяСтрока.СсылочныйТип = СоответствиеСсылочныйТип[БазовыйТипЧислом];
		Если НоваяСтрока.СсылочныйТип Тогда
			НоваяСтрока.УникальныйИдентификатор = НоваяСтрока.НайденныйОбъект.УникальныйИдентификатор();
		КонецЕсли;

		Если Первый Тогда

			Элементы.РезультатПоиска.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
			Первый = Ложь;

		КонецЕсли;
		;

	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура ОткрытьОбъектТекущейСтроки()
	ТекДанные = Элементы.РезультатПоиска.ТекущиеДанные;
	Если ТекДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Если Не ТекДанные.МожноОткрыть Тогда
		Возврат;
	КонецЕсли;

	ПоказатьЗначение( , ТекДанные.НайденныйОбъект);

КонецПроцедуры
&НаКлиенте
Процедура ВыполнитьПоискСсылок()
	Если Не ЗначениеЗаполнено(Объект.ИсходныйОбъект) Тогда
		УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не выбран объект, на который необходимо найти ссылки", ,
			"Объект.ИсходныйОбъект");
		Возврат;
	КонецЕсли;

	Состояние("Выполняется поиск ссылок на объект", , , БиблиотекаКартинок.УправлениеПоиском);
	ВыполнитьПоискСсылокНаСервере();
	Состояние("Поиск ссылок на объект завершен", , , БиблиотекаКартинок.УправлениеПоиском);

	ЭтотОбъект.ТекущийЭлемент = Элементы.РезультатПоиска;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПредставлениеНайденногоОбъекта(БазовыйТипЧислом, МетаданныеОбъекта, НайденныйОбъект)

	Представление = СокрЛП(НайденныйОбъект);
	Если БазовыйТипЧислом = 2 Или БазовыйТипЧислом = 3 Или БазовыйТипЧислом = 8 Или БазовыйТипЧислом = 9
		Или БазовыйТипЧислом = 10 Или БазовыйТипЧислом = 11 Или БазовыйТипЧислом = 12 Или БазовыйТипЧислом = 14 Тогда

	ИначеЕсли БазовыйТипЧислом = 4 Или БазовыйТипЧислом = 5 Или БазовыйТипЧислом = 6 Или БазовыйТипЧислом = 7 Тогда

		Представление = "";
		Если МетаданныеОбъекта.InformationRegisterPeriodicity
			<> Метаданные.СвойстваОбъектов.ПериодичностьРегистраСведений.Непериодический Тогда

			Представление = Строка(НайденныйОбъект.Период);

		КонецЕсли;

		Если МетаданныеОбъекта.WriteMode = Метаданные.СвойстваОбъектов.РежимЗаписиРегистра.ПодчинениеРегистратору Тогда

			Представление = ?(СтрДлина(Представление) = 0, "", Представление + "; ") + Строка(
				НайденныйОбъект.Регистратор);

		КонецЕсли;

		Для Каждого Измерение Из МетаданныеОбъекта.Измерения Цикл

			Представление = ?(СтрДлина(Представление) = 0, "", Представление + "; ") + Строка(
				НайденныйОбъект[Измерение.Имя]);

		КонецЦикла;

	ИначеЕсли БазовыйТипЧислом = 13 Тогда

		Представление = "";
		Для Каждого Измерение Из МетаданныеОбъекта.KeyFields Цикл

			Представление = ?(СтрДлина(Представление) = 0, "", Представление + "; ") + Строка(
				НайденныйОбъект[Измерение.Имя]);

		КонецЦикла;
	КонецЕсли;

	Возврат Представление;

КонецФункции

&НаСервереБезКонтекста
Функция ТипМетаданныхЧислом(МетаданныеОбъекта)

	ТипМетаданных = 0;
	Если Метаданные.Константы.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 1;
	ИначеЕсли Метаданные.Справочники.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 2;
	ИначеЕсли Метаданные.Документы.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 3;
	ИначеЕсли Метаданные.РегистрыНакопления.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 4;
	ИначеЕсли Метаданные.РегистрыБухгалтерии.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 5;
	ИначеЕсли Метаданные.РегистрыРасчета.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 6;
	ИначеЕсли Метаданные.РегистрыСведений.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 7;
	ИначеЕсли Метаданные.БизнесПроцессы.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 8;
	ИначеЕсли Метаданные.Задачи.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 9;
	ИначеЕсли Метаданные.ПланыВидовХарактеристик.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 10;
	ИначеЕсли Метаданные.ПланыВидовРасчета.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 11;
	ИначеЕсли Метаданные.ПланыСчетов.Содержит(МетаданныеОбъекта) Тогда

		ТипМетаданных = 12;
	Иначе
		Для Каждого ВнешнийИсточник Из Метаданные.ВнешниеИсточникиДанных Цикл

			Если ВнешнийИсточник.Таблицы.Содержит(МетаданныеОбъекта) Тогда

				Если МетаданныеОбъекта.TableDataType
					= Метаданные.СвойстваОбъектов.ТипДанныхТаблицыВнешнегоИсточникаДанных.ОбъектныеДанные Тогда

					ТипМетаданных = 14; // object table
				Иначе

					ТипМетаданных = 13; // non-object table
				КонецЕсли;
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Возврат ТипМетаданных;

КонецФункции

//TODO Необходимо перенести эту функцию в общий модуль. Сейчас она просто скопирована из УИ_РедакторРеквизитовОбъекта.ФормаОбъекта
&НаСервереБезКонтекста
Функция вНайтиОбъектПоURL(Знач URL)
	Поз1 = Найти(URL, "e1cib/data/");
	Поз2 = Найти(URL, "?ref=");

	Если Поз1 = 0 Или Поз2 = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;

	Попытка
		ИмяТипа = Сред(URL, Поз1 + 11, Поз2 - Поз1 - 11);
		ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ИмяТипа + ".ПустаяСсылка"));
		ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(URL, Поз2 + 5));
		Ссылка = ЗначениеИзСтрокиВнутр(ЗначениеСсылки);
	Исключение
		Возврат Неопределено;
	КонецПопытки;

	Возврат Ссылка;
КонецФункции

#КонецОбласти